package test.反射;


import java.lang.reflect.Constructor;

/**
 *created by chengxiaoqi1 on2018 /5 /17
 */
public class ReflectionConstruction {
    public static void main(String[] args) {
        /**
         *  批量获取构造方法
         *  1. java.lang.Class#getConstructors() 所有公有构造方法
         *  2. java.lang.Class#getDeclaredConstructors() 获取所有受保护构造方法
         *
         *  单个获取构造方法
         *  1. java.lang.Class#getConstructor(java.lang.Class[]) 获取耽搁公有构造方法
         *  2. java.lang.Class#getDeclaredConstructor(java.lang.Class[]) 获取没有构造方法，可以是 私有 受保护 默认, 公有
         */
        try {
            Class stuClazz = Class.forName("entity.Student");
            System.out.println("-- 所有公有构造方法 --");
            Constructor[] constructorArr = stuClazz.getConstructors();
            for (Constructor constructor : constructorArr) {
                System.out.println(constructor);
            }

            System.out.println("所有构造方法(私有，公有，受保护，默认)");
            constructorArr = stuClazz.getDeclaredConstructors();
            for (Constructor constructor : constructorArr) {
                System.out.println(constructor);
            }

            System.out.println("获取公有,无参构造方法");
            Constructor constructor = stuClazz.getConstructor(null);
            System.out.println(constructor);
            constructor = stuClazz.getConstructor(String.class, int.class);
            System.out.println(constructor);

            Object obj = constructor.newInstance("chengxq", 30);
            System.out.println(obj);

            System.out.println("-- 获取私有构造方法，并调用 --");
            constructor = stuClazz.getDeclaredConstructor(int.class);
            System.out.println(constructor);
            constructor.setAccessible(true);
            constructor.newInstance(30);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
